/////////////////////////////////////////////////////////////////////////////////////////////
///<Filename>  		IEvent.h			<\Filename>
///<Date>      		09/26/2011			<\Date>      
///<Author>   		Richard A. Small	<\Author>   
///<Purpose>   	
///		Defines a interface class for all scene types
///<\Purpose>
/////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#include "../Utility/HashString.h"

class IScene
{
public:
	IScene(void) { }
	virtual ~IScene(void) = 0 { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the scene identifier </Summary>
	///
	/// <Return>	The scene identifier </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual const HashString& GetSceneID() = 0;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Enter </Summary>
	///
	/// <Param name="previousState">	The previous state </Param>
	/// 
	/// <Remarks>	
	///		This will be called whenever this state has been pushed onto the stack
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Enter(const HashString& previousState) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Exit </Summary>
	/// 
	/// <Remarks>	
	///		This will be called whenever this state is popped from the stack
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Exit() { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Resume </Summary>
	///
	/// <Param name="previousState">	The previous state </Param>
	/// 
	/// <Remarks>	
	///		This will be called whenever this state resumes its place at the top of the stack
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Resume(const HashString& previousState) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Override </Summary>
	/// 
	/// <Remarks>	
	///		This will be called whenever this state stops being at the top of the stack
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Override() { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Input </Summary>
	///
	/// <Param name="delta">	Delta time value </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Input(float delta) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Update </Summary>
	///
	/// <Param name="delta">	Delta time value </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Update(float delta) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Render </Summary>
	///
	/// <Param name="delta">	Delta time value </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Render(float delta) { }
};

class TestScene : public IScene
{
public:

	static const HashString SCENEID;

public:

	TestScene(void) { }
	virtual ~TestScene(void) { }

	virtual const HashString& GetSceneID() { return SCENEID; }
};